package com.zw.langchainai.tools;

import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.agent.tool.ToolMemoryId;
import org.springframework.stereotype.Component;

@Component
public class CalculatorTools {

    /**
     * 计算两个数的和
     * name : 工具名称, 如果未提供, 则使用方法名称
     * value : 工具描述,
     * 根据工具的不同，即使没有任何描述，大语言模型可能也能很好地理解它（例如，`add(a, b)` 就很直观），
     * 但通常最好提供清晰且有意义的名称和描述。
     * 这样，大语言模型就能获得更多信息，以决定是否调用给定的工具以及如何调用
     *
     * P : 方法的参数可以采取@P注解，指定参数名称和是否必填。
     * ToolMemoryId : 如果你的AIService方法中有一个参数使用 @MemoryId 注解，
     *                那么你也可以使用 @ToolMemoryId 注解 @Tool 方法中的一个参数。
     *                提供给AIService方法的值将自动传递给 @Tool 方法。
     *                如果你有多个用户，或每个用户有多个聊天记忆，并且希望在 @Tool 方法中对它们进行区分，那么这个功能会很有用。
     */
    @Tool(name = "计算两个数的和", value = "返回一个数字")
    double sum(@ToolMemoryId String memoryId, @P(value = "a", required = true) double a, @P(value = "b", required = true) double b) {
        System.out.println("调用加法运算");
        return a + b;
    }

    @Tool(name = "计算平方根", value = "返回给定参数的平方根")
    double squareRoot(@ToolMemoryId String memoryId, double x) {
        System.out.println("调用平方根运算");
        return Math.sqrt(x);
    }
}
